import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../apis/app.dart';
import '../static/custom_code.dart';

/// AI创作控制器
class AiCreationController extends GetxController {
  // ========== 基础信息 ==========
  // 选择的AI创作类型：0-AI续写剧情，1-AI对话续写
  var creationType = 0.obs;
  
  // 是否为续写模式
  var isContinuation = false.obs;
  
  // 父文章ID
  var parentNotesId = 0;
  
  // ========== 原文相关 ==========
  // 原文内容（续写模式）
  var originalContent = ''.obs;
  var originalTitle = ''.obs;
  var originalAuthor = ''.obs;
  
  // 原文是否折叠
  var isOriginalCollapsed = false.obs;
  
  // 原文是否加载中
  var isLoadingOriginal = true.obs;
  
  // 历史内容（从根节点到当前节点的完整内容）
  var historicalContent = ''.obs;
  var isLoadingHistorical = false.obs;
  var hasLoadedHistorical = false.obs;
  
  // ========== 用户输入 ==========
  // 情节提示输入控制器
  final TextEditingController plotInputController = TextEditingController();
  
  // 反馈输入控制器
  final TextEditingController feedbackController = TextEditingController();
  
  // ========== 对话续写相关 ==========
  // 对话内容（从聊天页面传递）
  var dialogueContent = ''.obs;
  
  // 辅助提示词
  var assistantPrompt = ''.obs;
  
  // 选中的风格标签
  var selectedStyles = <String>[].obs;
  
  // ========== 生成状态 ==========
  // 是否正在生成
  var isGenerating = false.obs;
  
  // 生成进度文案
  var generatingProgress = ''.obs;
  
  // 已生成的内容
  var generatedContent = ''.obs;
  
  // 是否已有生成结果
  var hasGeneratedContent = false.obs;
  
  // 生成历史（最多保存5条）
  var generationHistory = <Map<String, dynamic>>[].obs;
  
  // 当前查看的历史索引
  var currentHistoryIndex = 0.obs;
  
  // ========== 可选风格标签 ==========
  final List<Map<String, dynamic>> styleOptions = [
    {'label': '情节反转', 'icon': '🔄', 'value': 'plot_twist'},
    {'label': '轻松幽默', 'icon': '😊', 'value': 'humor'},
    {'label': '悲伤感人', 'icon': '😢', 'value': 'sad'},
    {'label': '紧张刺激', 'icon': '🔥', 'value': 'thriller'},
    {'label': '温馨治愈', 'icon': '🌸', 'value': 'healing'},
    {'label': '快节奏', 'icon': '⚡', 'value': 'fast_paced'},
    {'label': '多视角', 'icon': '🎭', 'value': 'multi_perspective'},
    {'label': '心理描写', 'icon': '💭', 'value': 'psychological'},
  ];
  
  @override
  void onInit() {
    super.onInit();
    
    // 获取参数
    if (Get.arguments != null) {
      Map<String, dynamic> args = Get.arguments;
      
      if (args.containsKey('isContinuation')) {
        isContinuation.value = args['isContinuation'];
      }
      
      if (args.containsKey('parentNotesId')) {
        parentNotesId = args['parentNotesId'];
      }
      
      if (args.containsKey('creationType')) {
        creationType.value = args['creationType'];
      }
      
      // ========== 新增：接收对话内容和辅助提示词 ==========
      if (args.containsKey('dialogueContent')) {
        dialogueContent.value = args['dialogueContent'] ?? '';
        // 自动填充到输入框
        if (dialogueContent.value.isNotEmpty) {
          plotInputController.text = dialogueContent.value;
        }
      }
      
      if (args.containsKey('assistantPrompt')) {
        assistantPrompt.value = args['assistantPrompt'] ?? '';
        // 如果有辅助提示词，追加到输入框
        if (assistantPrompt.value.isNotEmpty && plotInputController.text.isNotEmpty) {
          plotInputController.text += '\n\n${assistantPrompt.value}';
        } else if (assistantPrompt.value.isNotEmpty) {
          plotInputController.text = assistantPrompt.value;
        }
      }
      // =================================================
      
      Get.log('🤖 AI创作页面初始化');
      Get.log('   是否续写模式: ${isContinuation.value}');
      Get.log('   父文章ID: $parentNotesId');
      Get.log('   创作类型: ${creationType.value == 0 ? "AI续写剧情" : "AI对话续写"}');
      Get.log('   对话内容长度: ${dialogueContent.value.length}');
      Get.log('   辅助提示词: ${assistantPrompt.value}');
    }
    
    // 如果是续写模式，加载原文
    if (isContinuation.value && parentNotesId > 0) {
      loadOriginalContent();
    } else {
      isLoadingOriginal.value = false;
    }
  }
  
  /// 加载原文内容
  Future<void> loadOriginalContent() async {
    try {
      isLoadingOriginal.value = true;
      
      // 调用后台接口获取文章内容
      final response = await NoteApi.getNotesDetail(parentNotesId);
      
      if (response.code == StatusCode.getSuccess) {
        // 从接口返回的数据中提取信息
        final data = response.data;
        originalTitle.value = data['title'] ?? '无标题';
        originalContent.value = data['content'] ?? '';
        
        // 获取作者信息
        if (data['belongUser'] != null) {
          originalAuthor.value = data['belongUser']['nickname'] ?? '匿名用户';
        } else {
          originalAuthor.value = '匿名用户';
        }
        
        Get.log('✅ 原文加载成功');
        Get.log('   标题: ${originalTitle.value}');
        Get.log('   作者: ${originalAuthor.value}');
      } else {
        Get.log('❌ 原文加载失败: ${response.msg}');
        Get.snackbar(
          '加载失败',
          response.msg ?? '获取原文失败',
          snackPosition: SnackPosition.TOP,
          duration: const Duration(seconds: 2),
        );
      }
    } catch (e) {
      Get.log('❌ 原文加载异常: $e');
      Get.snackbar(
        '加载失败',
        '获取原文时发生错误',
        snackPosition: SnackPosition.TOP,
        duration: const Duration(seconds: 2),
      );
    } finally {
      isLoadingOriginal.value = false;
    }
  }
  
  /// 加载历史内容（从根节点到当前节点的完整内容）
  Future<void> loadHistoricalContent() async {
    try {
      isLoadingHistorical.value = true;
      
      // 调用后台接口获取历史内容
      final response = await NoteApi.getHistoricalContent(parentNotesId);
      
      if (response.code == StatusCode.getSuccess) {
        // 接口返回的是字符串类型的完整内容
        historicalContent.value = response.data ?? '';
        hasLoadedHistorical.value = true;
        
        Get.log('✅ 历史内容加载成功');
        Get.log('   内容长度: ${historicalContent.value.length}');
      } else {
        Get.log('❌ 历史内容加载失败: ${response.msg}');
        Get.snackbar(
          '加载失败',
          response.msg ?? '获取历史内容失败',
          snackPosition: SnackPosition.TOP,
          duration: const Duration(seconds: 2),
        );
      }
    } catch (e) {
      Get.log('❌ 历史内容加载异常: $e');
      Get.snackbar(
        '加载失败',
        '获取历史内容时发生错误',
        snackPosition: SnackPosition.TOP,
        duration: const Duration(seconds: 2),
      );
    } finally {
      isLoadingHistorical.value = false;
    }
  }
  
  /// 切换风格标签选择
  void toggleStyle(String styleValue) {
    if (selectedStyles.contains(styleValue)) {
      selectedStyles.remove(styleValue);
    } else {
      selectedStyles.add(styleValue);
    }
  }
  
  /// 生成内容
  Future<void> generateContent() async {
    // 验证输入
    if (plotInputController.text.trim().isEmpty && selectedStyles.isEmpty) {
      Get.snackbar(
        '提示',
        '请输入情节提示或选择风格标签',
        snackPosition: SnackPosition.TOP,
        duration: const Duration(seconds: 2),
      );
      return;
    }
    
    try {
      isGenerating.value = true;
      hasGeneratedContent.value = false;
      generatedContent.value = '';
      
      // 更新生成进度
      generatingProgress.value = '正在分析输入...';
      
      // 构建场景描述：将用户输入和风格标签组合
      String sceneDescription = plotInputController.text.trim();
      
      // 如果选择了风格标签，添加到描述中
      if (selectedStyles.isNotEmpty) {
        List<String> styleLabels = selectedStyles.map((styleValue) {
          var style = styleOptions.firstWhere(
            (s) => s['value'] == styleValue,
            orElse: () => {'label': styleValue},
          );
          return style['label'] as String;
        }).toList();
        
        String stylesText = styleLabels.join('、');
        if (sceneDescription.isNotEmpty) {
          sceneDescription += '\n\n风格要求：$stylesText';
        } else {
          sceneDescription = '风格要求：$stylesText';
        }
      }
      
      Get.log('📝 场景描述: $sceneDescription');
      
      if (isContinuation.value) {
        generatingProgress.value = '正在理解原文...';
      }
      
      // 调用后台接口生成内容
      final response = await NoteApi.generatePlot(
        nodeId: isContinuation.value ? parentNotesId : null,
        sceneDescription: sceneDescription,
        k: 3,
        forceRecreate: false,
      );
      
      generatingProgress.value = '正在生成内容...';
      
      if (response.code == StatusCode.postSuccess) {
        // 从返回的JSONObject中提取生成的内容
        final data = response.data;
        
        // 根据实际返回的字段名提取内容
        // 假设返回格式为 {"content": "生成的内容", ...}
        if (data is Map && data.containsKey('content')) {
          generatedContent.value = data['content'] ?? '';
        } else if (data is Map && data.containsKey('generatedContent')) {
          generatedContent.value = data['generatedContent'] ?? '';
        } else if (data is String) {
          generatedContent.value = data;
        } else {
          // 如果不确定字段名，尝试转换整个对象
          generatedContent.value = data.toString();
        }
        
        hasGeneratedContent.value = true;
        
        // 保存到历史记录
        addToHistory();
        
        Get.log('✅ 内容生成成功');
        Get.log('   内容长度: ${generatedContent.value.length}');
      } else {
        Get.log('❌ 内容生成失败: ${response.msg}');
        Get.snackbar(
          '生成失败',
          response.msg ?? '生成内容失败，请稍后重试',
          snackPosition: SnackPosition.TOP,
          duration: const Duration(seconds: 3),
        );
      }
    } catch (e) {
      Get.log('❌ 内容生成异常: $e');
      Get.snackbar(
        '生成失败',
        '生成内容时发生错误：$e',
        snackPosition: SnackPosition.TOP,
        duration: const Duration(seconds: 3),
      );
    } finally {
      isGenerating.value = false;
      generatingProgress.value = '';
    }
  }
  
  /// 基于反馈重新生成
  Future<void> regenerateWithFeedback() async {
    if (feedbackController.text.trim().isEmpty) {
      Get.snackbar(
        '提示',
        '请输入您的反馈意见',
        snackPosition: SnackPosition.TOP,
        duration: const Duration(seconds: 2),
      );
      return;
    }
    
    try {
      isGenerating.value = true;
      
      generatingProgress.value = '正在理解您的反馈...';
      
      // 构建场景描述：原有的情节描述
      String sceneDescription = plotInputController.text.trim();
      
      // 如果选择了风格标签，添加到描述中
      if (selectedStyles.isNotEmpty) {
        List<String> styleLabels = selectedStyles.map((styleValue) {
          var style = styleOptions.firstWhere(
            (s) => s['value'] == styleValue,
            orElse: () => {'label': styleValue},
          );
          return style['label'] as String;
        }).toList();
        
        String stylesText = styleLabels.join('、');
        if (sceneDescription.isNotEmpty) {
          sceneDescription += '\n\n风格要求：$stylesText';
        } else {
          sceneDescription = '风格要求：$stylesText';
        }
      }
      
      generatingProgress.value = '正在优化内容...';
      
      // 调用后台接口，带上反馈信息和forceRecreate=true
      final response = await NoteApi.generatePlot(
        nodeId: isContinuation.value ? parentNotesId : null,
        sceneDescription: sceneDescription,
        feedback: feedbackController.text.trim(),
        k: 3,
        forceRecreate: true, // 反馈时强制重新生成
      );
      
      if (response.code == StatusCode.postSuccess) {
        // 从返回的JSONObject中提取生成的内容
        final data = response.data;
        
        // 根据实际返回的字段名提取内容
        if (data is Map && data.containsKey('content')) {
          generatedContent.value = data['content'] ?? '';
        } else if (data is Map && data.containsKey('generatedContent')) {
          generatedContent.value = data['generatedContent'] ?? '';
        } else if (data is String) {
          generatedContent.value = data;
        } else {
          generatedContent.value = data.toString();
        }
        
        // 清空反馈输入
        feedbackController.clear();
        
        // 保存到历史记录
        addToHistory();
        
        Get.log('✅ 内容重新生成成功（基于反馈）');
        Get.log('   新内容长度: ${generatedContent.value.length}');
      } else {
        Get.log('❌ 内容重新生成失败: ${response.msg}');
        Get.snackbar(
          '重新生成失败',
          response.msg ?? '重新生成内容失败，请稍后重试',
          snackPosition: SnackPosition.TOP,
          duration: const Duration(seconds: 3),
        );
      }
    } catch (e) {
      Get.log('❌ 内容重新生成异常: $e');
      Get.snackbar(
        '重新生成失败',
        '重新生成内容时发生错误：$e',
        snackPosition: SnackPosition.TOP,
        duration: const Duration(seconds: 3),
      );
    } finally {
      isGenerating.value = false;
      generatingProgress.value = '';
    }
  }
  
  /// 快捷反馈
  Future<void> quickFeedback(String feedback) async {
    feedbackController.text = feedback;
    await regenerateWithFeedback();
  }
  
  /// 清空所有内容
  void clearAll() {
    Get.dialog(
      AlertDialog(
        title: const Text('确认清空'),
        content: const Text('清空后将丢失当前所有输入和生成的内容，确定要清空吗？'),
        actions: [
          TextButton(
            onPressed: () => Get.back(),
            child: const Text('取消'),
          ),
          TextButton(
            onPressed: () {
              plotInputController.clear();
              feedbackController.clear();
              selectedStyles.clear();
              generatedContent.value = '';
              hasGeneratedContent.value = false;
              generationHistory.clear();
              currentHistoryIndex.value = 0;
              Get.back();
              Get.snackbar(
                '已清空',
                '可以重新开始创作了',
                snackPosition: SnackPosition.TOP,
                duration: const Duration(seconds: 2),
              );
            },
            child: const Text('确定', style: TextStyle(color: Colors.red)),
          ),
        ],
      ),
    );
  }
  
  /// 采用生成的内容
  void adoptContent() {
    if (!hasGeneratedContent.value) {
      Get.snackbar(
        '提示',
        '请先生成内容',
        snackPosition: SnackPosition.TOP,
        duration: const Duration(seconds: 2),
      );
      return;
    }
    
    Get.log('✅ 采用生成的内容');
    Get.log('   内容长度: ${generatedContent.value.length}');
    Get.log('   创作类型: ${creationType.value}');
    
    final result = {
      'content': generatedContent.value,
      'adopted': true,
    };
    
    // 返回到上一页（可能是发布页面或聊天页面）
    // 如果是从聊天页面进入的，聊天页面会接收到这个结果并继续传递
    Get.back(result: result);
  }
  
  /// 添加到历史记录
  void addToHistory() {
    generationHistory.insert(0, {
      'content': generatedContent.value,
      'timestamp': DateTime.now(),
      'plotPrompt': plotInputController.text,
      'styles': List<String>.from(selectedStyles),
    });
    
    // 最多保存5条历史
    if (generationHistory.length > 5) {
      generationHistory.removeRange(5, generationHistory.length);
    }
    
    currentHistoryIndex.value = 0;
  }
  
  /// 查看历史记录
  void viewHistory(int index) {
    if (index >= 0 && index < generationHistory.length) {
      currentHistoryIndex.value = index;
      var history = generationHistory[index];
      generatedContent.value = history['content'];
    }
  }
  
  @override
  void onClose() {
    plotInputController.dispose();
    feedbackController.dispose();
    super.onClose();
  }
}

